(function () {
    // 定义一个表示人的类
    class Person {
        /*
        * TS 可以在属性前添加修饰符
        * public 修饰的属性可以在任意位置访问修改 默认
        * private 私有属性 只能在类内部访问修改
        *   - 可以在类中添加方法被外部访问
        * protected 受保护的属性，只能在当前类和子类中访问修改，类以外不行
        * */
        private _name: string;
        private _age: number;

        constructor(name: string, age: number) {
            this._name = name
            this._age = age
        }

        /*
        * getter 方法用来读取属性
        * setter 方法用来设置属性
        *   - 它们被称为属性的存取器
        * */

        // 定义方法用来获取_name属性
        // getName() {
        //     return this._name
        // }
        //
        // setName(val: string) {
        //     this._name = val
        // }
        //
        // getAge () {
        //     return this._age
        // }
        //
        // setAge (val: number) {
        //     if (val > 0) {
        //         this._age = val
        //     }
        // }

        /*
        * TS 中设置 getter / setter 方法的方式
        * */
        get name () {
            return this._name
        }

        set name (val) {
            this._name = val
        }

        get age () {
            return this._age
        }

        set age (val) {
            if (val > 0) {
                this._age = val
            }
        }
    }

    const per = new Person('孙悟空', 18)

    /*
    * 属性在对象中设置的，可以被任意修改
    * 属性可以被任意修改，会导致对象中的数据变得不安全
    * 解决：使用 private 限制 noEmitOnError 设置为 true
    * */
    // console.log(per.getName())
    // per.setName('猪八戒')
    //
    // console.log(per.getAge())
    // per.setAge(-33) // 设置不上
    // console.log(per)

    per.name = '猪八戒'
    console.log(per.name)

    per.age = 33
    per.age = -33
    console.log(per.age)



    // class A {
    //     name: string;
    //     age: number
    //
    //     constructor(name: string, age: number) {
    //         this.name = name
    //         this.age = age
    //     }
    // }

    /* 等价于 */

    class A {
        constructor(public name: string, public age: number) {
        }
    }

})()